﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using EGuayas.Web.Resources;
using EntGuayasSLA.BL;
using EntGuayasSLA.BL.Archivos.Pdf;
using EntGuayasSLA.BL.Listas;
using EntGuayasSLA.BL.Listas.Criterias;
using Ext.Net;

namespace EGuayas.Web.EGlobal.dma
{
    public partial class pgDOficios : pgBase
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!X.IsAjaxRequest)
                {
                   
                }
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }
        }
    
        [DirectMethod]
        public static string GetSubDoc(Dictionary<string, string> parameters)
        {
            ArchivoSubArchivosCriteria criteria = ArchivoSubArchivosCriteria.NewArchivoSubArchivosCriteria();
            criteria.Id = parameters["id"];
            criteria.Tabla ="";

            var data = ArchivoLista.GetArchivoLista(criteria);


            if (data.Count != 0)
            {
               
                GridPanel grid = new GridPanel
                {
                    Height = 90,
                    EnableColumnHide = false,
                    Store = 
            { 
                new Store 
                { 
                    Model = {
                        new Model {
                            IDProperty = "Id",
                            Fields = 
                            {
                                new ModelField("Id"),
                                new ModelField("Nombre"),
                                new ModelField("Descripcion"),
                                new ModelField("FechaCreacion"),
                                new ModelField("Version"),
                                new ModelField("Ruta")
                            }
                        }
                    },
                    DataSource = data
                }
            },
                    ColumnModel =
                    {
                        Columns = { }
                    },

                };


                Column addColumn1 = new Column();
                addColumn1.Text = "Nombre";
                addColumn1.DataIndex = "Nombre";
                addColumn1.Flex = 4;
                grid.ColumnModel.Columns.Add(addColumn1);

                Column addColumn2 = new Column();
                addColumn2.Text = "Descripción";
                addColumn2.DataIndex = "Descripcion";
                addColumn2.Flex = 4;
                grid.ColumnModel.Columns.Add(addColumn2);

                Column addColumn3 = new Column();
                addColumn3.Text = "Fecha";
                addColumn3.DataIndex = "FechaCreacion";
                addColumn3.Flex = 4;
                grid.ColumnModel.Columns.Add(addColumn3);

                Column addColumn4 = new Column();
                addColumn4.Text = "Versión";
                addColumn4.DataIndex = "Version";
                addColumn4.Flex = 4;
                grid.ColumnModel.Columns.Add(addColumn4);

                CommandColumn commandColumn = new CommandColumn();
                commandColumn.ID = "colAction" + System.Guid.NewGuid();
                commandColumn.Flex = 1;
                //commandColumn.Text = "Visualizar";
                commandColumn.DataIndex = "Id";
                commandColumn.Commands.Add(new GridCommand { Icon = Ext.Net.Icon.Zoom, CommandName = "View", Text = "Vizualizar" });
                commandColumn.Listeners.Command.Handler = "AppGlobalJs.showPdf('../../..',record.data.Ruta);";


                //commandColumn.DirectEvents.Command.Event += GrdSubDoc_Command;
                //commandColumn.DirectEvents.Command.ExtraParams.Add(new Parameter { Name = "Id", Value = "record.data.Id" });
                //commandColumn.DirectEvents.Command.ExtraParams.Add(new Parameter { Name = "command", Value = "command" });
                grid.ColumnModel.Columns.Add(commandColumn);
                return ComponentLoader.ToConfig(grid);
            }
            return null;
        }
     
        [DirectMethod]
        public OficiosLista BindDataRevizar()
        {
            try
            {
                return OficiosLista.GetOficiosLista(Valores.Codigo_CHAR_Revizar);
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }
            return null;
        }
       
        [DirectMethod]
        public OficiosLista BindDataComentario()
        {
            try
            {
                return OficiosLista.GetOficiosLista(Valores.Codigo_CHAR_No);
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }
            return null;
        }
        [DirectMethod]
        public OficiosLista BindDataRevizados()
        {
            try
            {
                return OficiosLista.GetOficiosLista(Valores.Codigo_CHAR_Si);
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }
            return null;
        }
        private void SendMail(Oficio objOficio)
        {
            try
            {
                string sTxtMail = string.Format("Buen día Sr(a) :<br/> El Oficio: {0} con descripción:{1} <b>es aprobado</b> {2}",objOficio.Numero,objOficio.Descripcion,  ".<br/>");

                MyMail.Enviar("", objOficio.Correo, "Notificación de oficios", sTxtMail, true, "Notificación oficios");
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }
        }
        protected void btnAprobar_Click(object sender, DirectEventArgs e)
        {
            try
            {
                Oficio objOficio = Oficio.GetEditableRoot(Guid.Parse(e.ExtraParams["Id"]));
                objOficio.ArchivoId = this.loadNewVersion(e);
                objOficio.Estado    = e.ExtraParams["Revizar"];
                if (e.ExtraParams["Revizar"] == "N")
                { 
                       SendMail(objOficio);
                }
                objOficio.Save();
                gpDocRevizados.GetStore().Reload();
                gpDocumentosLoad.GetStore().Reload();
                gpDocComentarios.GetStore().Reload();
                X.Msg.Show(new MessageBoxConfig
                {
                    Buttons = MessageBox.Button.OK,
                    Icon = MessageBox.Icon.INFO,
                    Title = Titulos.TituloAviso,
                    Message = "Informe notificado a correción"
                });
                this.winAprobar.Close();
            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }

        }
    
        /// <summary>
        /// Descargar archivo
        /// </summary>
        /// <param name="patch"></param>
        private void Download(string patch)
        {
            string pathFile = MapPath(patch);
            System.IO.FileInfo toDownload =
               new System.IO.FileInfo(pathFile);
            string fileExt = pathFile.Substring(pathFile.LastIndexOf('.') + 1);

            MaskConfig cfg = new MaskConfig();
            cfg.Msg = "Descargando archivo ...";
            cfg.El = "Ext.getBody()";
            X.Mask.Show(cfg);


            if (fileExt.ToLower() == "pdf")
            {
                byte[] OWNER = Encoding.UTF8.GetBytes(ConfigurationManager.AppSettings.Get("PwdPdf"));
                using (MemoryStream memory = Pdf.DecryptFilePdf(pathFile, OWNER))
                {
                    //Response.Clear();
                    //Response.ContentType = "application/pdf";
                    //Response.OutputStream.Write(memory.GetBuffer(), 0, memory.GetBuffer().Length);
                    //Response.OutputStream.Close();                   
                    //HttpContext.Current.ApplicationInstance.CompleteRequest();
                    byte[] bytes = memory.ToArray();
                    Response.Clear();
                    Response.ContentType = "application/force-download";
                    Response.AddHeader("content-disposition", "attachment; filename=" + toDownload.Name);
                    Response.BinaryWrite(bytes);
                    Response.End();

                }
            }
            else
            {
                Response.Clear();
                Response.AddHeader("Content-Disposition",
                                   "attachment; filename=" + toDownload.Name);
                Response.AddHeader("Content-Length",
                                   toDownload.Length.ToString());
                Response.ContentType = "application/octet-stream";
                Response.WriteFile(patch);
                Response.End();
            }
            //
            X.Mask.Hide();
        }
        // 
        protected void btnDowload_Click(object sender, DirectEventArgs e)
        {
            try
            {
             
                this.Download(e.ExtraParams["Ruta"]);

            }
            catch (Exception ex)
            {
                RegistrarLog(ex);
            }

        }
        private string loadNewVersion(DirectEventArgs e)
        {
            Archivo objArchAnterior = Archivo.GetEditableRoot(Guid.Parse(e.ExtraParams["IdArchivo"]), "");
            Boolean valDone = this.FileUploadDocUp.HasFile;
            string RefId    = "";
            string idArchivoNow = "";
            if (valDone)
            {

                int version = 0;
                string ruta = "";
                string fileName = "";
                string fileNameTmp = "";
                string fileExt = this.FileUploadDocUp.PostedFile.FileName.Substring(this.FileUploadDocUp.PostedFile.FileName.LastIndexOf('.') + 1);
                Archivo objNuevaVersArch = Archivo.NewEditableRoot("");
                objNuevaVersArch.Id = System.Guid.NewGuid();
                //Nuevas versiones datos correguidos
                objNuevaVersArch.SubirNuevo = "C";
                Int32.TryParse(e.ExtraParams["hddnDocUpVers"], out version);
                version = version + 1;
            
                this.GetNameFile(this.FileUploadDocUp, fileExt, ref ruta, ref fileName, ref fileNameTmp);
                byte[] USER = Encoding.UTF8.GetBytes(ConfigurationManager.AppSettings.Get("UserPdf"));
                byte[] OWNER = Encoding.UTF8.GetBytes(ConfigurationManager.AppSettings.Get("PwdPdf"));

                if (fileExt.ToLower() == "pdf")
                {
                    this.FileUploadDocUp.PostedFile.SaveAs(fileNameTmp);
                    Pdf.EncryptFilePdf(fileNameTmp, fileName, USER, OWNER);
                    File.Delete(fileNameTmp);
                }
                else
                {
                    this.FileUploadDocUp.PostedFile.SaveAs(fileName);
                }

                if (version > 2)
                {
                    objNuevaVersArch.Referencia = e.ExtraParams["hddnDocUpRef"];

                }
                else
                {
                    if (version == 2)
                    {

                        objNuevaVersArch.Referencia = e.ExtraParams["IdArchivo"];
                        if (objArchAnterior.Referencia == "")
                        {
                            RefId = objArchAnterior.Id.ToString();

                        }

                    }
                }
                objNuevaVersArch.Version = version;
                objNuevaVersArch.Nombre = objArchAnterior.Nombre + " V" + version.ToString();
                objNuevaVersArch.Descripcion = objArchAnterior.Descripcion;
                objNuevaVersArch.FechaCreacion = DateTime.Now;
                objNuevaVersArch.RequiereFirmar = Valores.Codigo_CHAR_No;
                objNuevaVersArch.Firmado = Valores.Codigo_CHAR_No;
                objNuevaVersArch.RequiereFirmar = Valores.Codigo_CHAR_No;
                objNuevaVersArch.PersonaId = GetSessionUsuario.PersonaId;
                objNuevaVersArch.GlobalRelacionId = objArchAnterior.GlobalRelacionId;
                objNuevaVersArch.ExpedienteId = objArchAnterior.ExpedienteId;
                objNuevaVersArch.Ruta = ruta;
                objNuevaVersArch.SubirNuevo = Valores.Codigo_CHAR_Si;
                objNuevaVersArch.Comentarios = e.ExtraParams["Comentarios"];
                objNuevaVersArch.Save();
                idArchivoNow = objNuevaVersArch.Id.ToString();
            }
            else
            {
                objArchAnterior.Comentarios = e.ExtraParams["Comentarios"];
                objArchAnterior.Save();
                idArchivoNow = objArchAnterior.Id.ToString();
            }
            return (idArchivoNow);
        }
       

    }
}